package org.pps.gl.client.vue;

import org.pps.gl.client.GetInfoService;
import org.pps.gl.client.GetInfoServiceAsync;
import org.pps.gl.client.LoginInfo;
import org.pps.gl.client.Pps_gl;
import org.pps.gl.client.data.UserInfo;
import org.pps.gl.client.events.RefreshUserEvent;
import org.pps.gl.client.events.RefreshUserEventHandler;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.datepicker.client.DateBox;

/**
 * Première page du profil utilisateur, son identité : nom prénom, photo, age et
 * statut
 * 
 */
public class PFL_Identite extends Composite implements RefreshUserEventHandler {

	private Label lblNom, lblDateNaissance, lblStatut, lblSexe;
	private TextBox txtBoxNom, txtBoxPrenom, txtBoxStatut;
	private VerticalPanel verticalPanel;
	private HorizontalPanel HPButton;
	private DockPanel dockPanel;
	private Button btnModifier, btnAnnuler;
	private Image imgPhotoProfil;
	private ListBox listBoxSexe;
	private DateBox dateBox;
	private String sexe;

	public PFL_Identite() {

		dockPanel = new DockPanel();
		initWidget(dockPanel);
		sexe = LoginInfo.getCurrentUser().getUserInfo().getSexe();
		if (sexe.contains("M"))
			imgPhotoProfil = new Image("images/logos/p_homme.png");
		else
			imgPhotoProfil = new Image("images/logos/p_femme.png");
		verticalPanel = new VerticalPanel();
		verticalPanel.setStyleName("profilMarge");
		lblNom = new Label();
		lblDateNaissance = new Label();
		btnModifier = new Button("Modifier");
		HPButton = new HorizontalPanel();
		lblStatut = new Label();
		lblSexe = new Label("");
		dateBox = new DateBox();

		Pps_gl.getCm().addRefreshUserHandler(this);

		afficherProfil();
		setInfo();

		// Gestionnaire d'évènement lors du click sur le bouton Modifier.
		btnModifier.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (btnModifier.getText().equals("Modifier"))
					modifierProfil();
				else {
					verticalPanel.clear();
					btnModifier.setText("Modifier");
					HPButton.remove(btnAnnuler);
					majInfo();

				}

			}

		});

	}

	/**
	 * Méthode qui récupère les modifications effectuées par l'utilisateur et
	 * les enregistre en base de données. Appel au service GetInfoService.
	 */
	protected void majInfo() {

		String nickName = txtBoxPrenom + " " + txtBoxNom;
		String firstName = null, lastName = null, statut = null, sexe = null, date = null;
		boolean update = false, erreur = false;

		// Nous vérifions les champs qui ont été modifiés afin de les mettre à
		// jour
		if (!nickName.equals(lblNom)) {
			firstName = txtBoxPrenom.getText();
			lastName = txtBoxNom.getText();
			update = true; // On doit mettre à jour ces champs
		}
		if ((txtBoxPrenom.getText().length()==0) || (txtBoxPrenom.getText().length()==0)) {
			erreur = true;
		}

		if (!lblStatut.equals(txtBoxStatut)) {
			statut = txtBoxStatut.getText();
			update = true; // On doit mettre à jour ce champ
		}
		if (txtBoxStatut.getText().length()==0) {
			erreur = true;
		}

		if (!lblSexe.equals(listBoxSexe.getItemText(listBoxSexe
				.getSelectedIndex()))) {
			update = true;
			if (listBoxSexe.getSelectedIndex() == 0)
				sexe = "M";
			else
				sexe = "F";
		}

		if (!lblDateNaissance.equals(dateBox.getTextBox().getText())) {
			date = dateBox.getTextBox().getText();
			update = true;
		}
		if (dateBox.getTextBox().getText().length()==0) {
			erreur = true;
		}

		// Si on doit mettre à jour au moins 1 champ, on fait appel au service
		// de mise à jour du datastore
		if (erreur)
			Window.alert("Un des champs n'est pas complété.");
		else if (update) {
			GetInfoServiceAsync majService = GWT.create(GetInfoService.class);
			majService.majIdentite(
					LoginInfo.getCurrentUser().getEmailAddress(), firstName,
					lastName, statut, sexe, date, new AsyncCallback<Boolean>() {

						@Override
						public void onFailure(Throwable caught) {
							
						}

						@Override
						public void onSuccess(Boolean result) {
							Pps_gl.getCm().refresh(); // On rafraichie les
														// données sur la page
						}
					});
		}

	}

	protected void afficherProfil() {

		dockPanel.clear();

		dockPanel.setSize("450px", "235px");

		dockPanel.add(imgPhotoProfil, DockPanel.WEST);
		dockPanel.setCellHorizontalAlignment(imgPhotoProfil,
				HasHorizontalAlignment.ALIGN_CENTER);
		dockPanel.setCellVerticalAlignment(imgPhotoProfil,
				HasVerticalAlignment.ALIGN_MIDDLE);

		dockPanel.add(verticalPanel, DockPanel.CENTER);
		dockPanel.setCellVerticalAlignment(verticalPanel,
				HasVerticalAlignment.ALIGN_BOTTOM);

		verticalPanel.add(lblNom);
		verticalPanel.setCellVerticalAlignment(lblNom,
				HasVerticalAlignment.ALIGN_BOTTOM);

		verticalPanel.add(lblSexe);
		verticalPanel.setCellVerticalAlignment(lblSexe,
				HasVerticalAlignment.ALIGN_BOTTOM);

		verticalPanel.add(lblDateNaissance);
		verticalPanel.setCellVerticalAlignment(lblDateNaissance,
				HasVerticalAlignment.ALIGN_BOTTOM);

		HPButton.add(btnModifier);
		dockPanel.add(HPButton, DockPanel.EAST);
		dockPanel.setCellHorizontalAlignment(HPButton,
				HasHorizontalAlignment.ALIGN_CENTER);
		dockPanel.setCellVerticalAlignment(HPButton,
				HasVerticalAlignment.ALIGN_MIDDLE);

		lblStatut.setStyleName("dynTitre2");

		dockPanel.add(lblStatut, DockPanel.SOUTH);
		dockPanel.setCellVerticalAlignment(lblStatut,
				HasVerticalAlignment.ALIGN_MIDDLE);
	}

	/**
	 * Méthode qui remplit les informations de l'utilisateur.
	 */
	public void setInfo() {
		UserInfo info = LoginInfo.getCurrentUser().getUserInfo();

		lblNom.setText(info.getFirstname() + " " + info.getLastname());
		lblDateNaissance.setText(info.getDateNaissance());
		lblStatut.setText(info.getStatut());

		if (info.getSexe().equals("M"))
			lblSexe.setText("Homme");
		else
			lblSexe.setText("Femme");
	}

	/**
	 * Méthode qui affiche les textBox permettant la modification du profil.
	 */
	public void modifierProfil() {
		LoginInfo user = LoginInfo.getCurrentUser();

		verticalPanel.remove(lblNom);
		verticalPanel.remove(lblSexe);
		verticalPanel.remove(lblDateNaissance);
		verticalPanel.remove(lblStatut);

		HorizontalPanel hp = new HorizontalPanel();

		txtBoxNom = new TextBox();
		txtBoxNom.setText(user.getLastname());
		txtBoxNom.setSize("80px", "15px");
		txtBoxPrenom = new TextBox();
		txtBoxPrenom.setText(user.getFirstname());
		txtBoxPrenom.setSize("80px", "15px");

		listBoxSexe = new ListBox();
		listBoxSexe.addItem("Homme");
		listBoxSexe.addItem("Femme");

		if (LoginInfo.getCurrentUser().getUserInfo().getSexe().equals("M"))
			listBoxSexe.setSelectedIndex(0);
		else
			listBoxSexe.setSelectedIndex(1);

		dateBox.setFormat(new DateBox.DefaultFormat(DateTimeFormat
				.getFormat("dd/MM/yyyy")));
		dateBox.setSize("80px", "15px");
		dateBox.getTextBox().setValue(
				LoginInfo.getCurrentUser().getUserInfo().getDateNaissance());

		hp.add(txtBoxNom);
		hp.add(txtBoxPrenom);
		verticalPanel.add(hp);
		verticalPanel.add(listBoxSexe);
		verticalPanel.add(dateBox);

		dockPanel.remove(lblStatut);
		txtBoxStatut = new TextBox();
		txtBoxStatut.setText(user.getUserInfo().getStatut());
		txtBoxStatut.setSize("180px", "15px");
		dockPanel.add(txtBoxStatut, DockPanel.SOUTH);
		dockPanel.setCellVerticalAlignment(txtBoxStatut,
				HasVerticalAlignment.ALIGN_MIDDLE);

		btnModifier.setText("Valider");

		btnAnnuler = new Button("Annuler");
		HPButton.add(btnAnnuler);

		btnAnnuler.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				verticalPanel.clear();
					dockPanel.remove(txtBoxStatut);
				btnModifier.setText("Modifier");
				HPButton.remove(btnAnnuler);
				afficherProfil();
			}

		});

	}

	/**
	 * Si on recupere un event de rafraichissement de la page.
	 */
	@Override
	public void onRefresh(RefreshUserEvent refreshEvent) {
		afficherProfil();
		setInfo();
	}

}
